package org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.futbolista.habilidad;

import java.util.ArrayList;

import org.javahispano.javacup.modelo.Comando;
import org.javahispano.javacup.modelo.ComandoGolpearBalon;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.futbolista.Futbolista;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.futbolista.FutbolistaBase;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.futbolista.Rol;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.util.PaseJugada;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.util.PosicionCampo;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.entrenador.Sugerencia;

/**
 * @author Joan Crosas
 *
 */
public class JugadaMortalPreparacion extends HabilidadConBalon {
	protected PosicionFutbolistaAtacante futbolistaAtacante1;
	protected PosicionFutbolistaAtacante futbolistaAtacante2;
	
	class PosicionFutbolistaAtacante {
		Futbolista futbolista;
		PosicionCampo posicionAtaque;
	}
	
	/**
	 * 
	 */
	public JugadaMortalPreparacion( Futbolista futbolista ) {
		super( futbolista );
	}

	@Override
	public boolean ejecutar() {
		if( isJugadaPosible( FutbolistaBase.JUGADA_MORTAL_POSICION_BALON, FutbolistaBase.JUGADA_MORTAL_TIEMPO_PREPARACION_INICIO ) ) {
			iniciarJugada( FutbolistaBase.JUGADA_MORTAL_POSICION_BALON );
			return true;
		}
		return false;
	}
	
	public boolean isJugadaPosible( PosicionCampo posicionJugadaBalon, int tiempoJugada ) {
		inicializar( posicionJugadaBalon );
		if( futbolistaAtacante1.posicionAtaque != null && futbolistaAtacante2.posicionAtaque != null ) {
			double distanciaFutbolista1 = futbolistaAtacante1.futbolista.distanciaRecorrida( tiempoJugada );
			double distanciaDestino1 = futbolistaAtacante1.posicionAtaque.distancia( futbolistaAtacante1.futbolista.getPosicion() );
			
			double distanciaFutbolista2 = futbolistaAtacante2.futbolista.distanciaRecorrida( tiempoJugada );
			double distanciaDestino2 = futbolistaAtacante2.posicionAtaque.distancia( futbolistaAtacante2.futbolista.getPosicion() );
			
			double distanciaPorteria = futbolista.getDistanciaPorteriaRival();
			
			if( distanciaFutbolista1 >= distanciaDestino1 && 
					distanciaFutbolista2 >= distanciaDestino2 && 
					distanciaPorteria < 40.0 ) {
				return true;
			}
		}
		return false;
		
	}
	
	protected void inicializar( PosicionCampo posicionJugadaBalon ) {
		futbolistaAtacante1 = null;
		futbolistaAtacante2 = null;
		
		ArrayList<Futbolista> futbolistas = futbolista.getVisionPartido().getFutbolistas();
		for( int i = 0; i < futbolistas.size(); i++ ) {
			Futbolista f = futbolistas.get(i); 
			if( f != futbolista && ( f.getRol() == Rol.DELANTERO || f.getIndice() == 8 ) ) {
				if( futbolistaAtacante1 == null ) {
					futbolistaAtacante1 = new PosicionFutbolistaAtacante();
					futbolistaAtacante1.futbolista = f;
				} else if( futbolistaAtacante2 == null ) {
					futbolistaAtacante2 = new PosicionFutbolistaAtacante();
					futbolistaAtacante2.futbolista = f;
				}
			}
		}
		
		PosicionCampo posicionAtaque1 = getPosicionJugadaFutbolista1( posicionJugadaBalon );
		PosicionCampo posicionAtaque2 = getPosicionJugadaFutbolista2( posicionJugadaBalon );
		
		if( futbolistaAtacante1.futbolista.getPosicion().distancia( posicionAtaque1 ) < 
				futbolistaAtacante1.futbolista.getPosicion().distancia( posicionAtaque2 ) ) {
			futbolistaAtacante1.posicionAtaque = posicionAtaque1;
			futbolistaAtacante2.posicionAtaque = posicionAtaque2;
		} else {
			Futbolista aux = futbolistaAtacante1.futbolista;
			futbolistaAtacante1.futbolista = futbolistaAtacante2.futbolista;
			futbolistaAtacante2.futbolista = aux;
			futbolistaAtacante1.posicionAtaque = posicionAtaque1;
			futbolistaAtacante2.posicionAtaque = posicionAtaque2;
		}
		
	}
	
	protected void iniciarJugada( PosicionCampo posicionJugadaBalon, PaseJugada paseJugada ) {
		// iniciem jugada mortal
		int tiempoValida = 21;
		if( paseJugada != null ) {
			tiempoValida = paseJugada.getPosicionJugadaBalon().getTiempo() + 2;
			Comando comando = new ComandoGolpearBalon( futbolista.getIndice(), paseJugada.getAnguloRemate()*180/Math.PI, paseJugada.getPotencia(), paseJugada.getAnguloVertical()*180/Math.PI );
			futbolista.getVisionPartido().addComando( comando );
		}
		
		futbolistaAtacante1.posicionAtaque = getPosicionJugadaFutbolista1(posicionJugadaBalon);
		futbolistaAtacante2.posicionAtaque = getPosicionJugadaFutbolista2(posicionJugadaBalon);
		
		Sugerencia sugerencia1 = new Sugerencia( Sugerencia.TipoSugerencia.JUGADA_MORTAL_JUGADOR_1 );
		sugerencia1.setFutbolista( futbolistaAtacante1.futbolista );
		sugerencia1.setPosicionDestino( futbolistaAtacante1.posicionAtaque );
		sugerencia1.setTiempoValida( tiempoValida );
		futbolista.getVisionPartido().addSugerencia( sugerencia1 );
		
		Sugerencia sugerencia2 = new Sugerencia( Sugerencia.TipoSugerencia.JUGADA_MORTAL_JUGADOR_2 );
		sugerencia2.setFutbolista( futbolistaAtacante2.futbolista );
		sugerencia2.setPosicionDestino( futbolistaAtacante2.posicionAtaque );
		sugerencia2.setTiempoValida( tiempoValida );
		futbolista.getVisionPartido().addSugerencia( sugerencia2 );
		
	}
	
	protected void iniciarJugada( PosicionCampo posicionJugadaBalon ) {
		iniciarJugada( posicionJugadaBalon, null );
		
	}
	
	public PosicionCampo getPosicionJugadaFutbolista1( PosicionCampo posicionJugadaBalon ) {
		PosicionCampo p = posicionJugadaBalon.moverAngulo( 3*Math.PI/2, 2.1 );
		return p.moverAngulo( Math.PI, 1.0 );
	}
	
	public PosicionCampo getPosicionJugadaFutbolista2( PosicionCampo posicionJugadaBalon ) {
		PosicionCampo p = posicionJugadaBalon.moverAngulo( 3*Math.PI/2, 2.1 );
		return p.moverAngulo( 0.0, 1.0 );
	}
}
